package com.vpen.server.codec;

import cn.hutool.core.util.RandomUtil;
import com.vpen.server.dto.FileMessage;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Objects;

/**
 * 描述
 *
 * @author 韦鹏
 * @date 2024/4/4 23:01
 */
@Slf4j
public class FileDecoder extends ByteToMessageDecoder {

    /**
     * 传数据时这个decode方法会一直被调用，直到ByteBuf里面没有可以读取的数据，并且List也不是null就会传给下面的handler了。
     *
     *
     * 1.直到ByteBuf里面没有可以读取的数据  2.并且List也不是null
     *
     * 符合这俩条件，decode就会把数据交给handler。
     *
     * 除非调用fireChannelRead
     *
     * */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 我主要的目的就是对字节解码，解码后，把消息和字节一起给下一个处理器

        in.readInt();

        ByteBuf copy = in.copy();
        log.debug("copy {}",ByteBufUtil.hexDump(copy));

        // duplicate().retain();
        ByteBuf dr = in.retainedDuplicate();
        out.add(new FileMessage().setHead(1L).setLength(1L).setData(ByteBufUtil.hexDump(dr)));
        out.add(dr);


        // 跳过所有的，
        in.skipBytes(in.readableBytes());
    }

//    @Override
//    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
//
//        // 标记当前的读索引
//        in.markReaderIndex();
//
//
//        byte header = in.readByte();
//        int anInt = in.getInt(1);
//
//
//        log.debug("FileDecoder解码:{}", Integer.toHexString(header));
//
//
//        out.add(new FileMessage().setHead(1L).setLength(1L).setData(ByteBufUtil.hexDump(in)));
//
//
//        // 引用+1
//        in.retain();
//
//        // 确认读操作完成后，重置到之前标记的索引
//        in.resetReaderIndex();
//        log.debug("file:index:{}",in.readerIndex());
//        // 如果当前ByteBuf还有可读字节，不会给下一个的，直到读完
//        // 如果没有给下一个，就会一直读
//        log.debug("fireChannelRead before");
//        ctx.fireChannelRead(in);
//        log.debug("fireChannelRead after");
//    }

}
